package com.problem.leetcode;

/**
 * TODO:待完善递归算法
 * Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
 * Output: 7 -> 0 -> 8
 * Explanation: 342 + 465 = 807.
 * <p>
 * 两个指针分别指向两个链表的头，一个临时变量 判断和是否需要进位
 * 如果一个链表遍历完，单独遍历剩余的链表
 * 终止条件，两个指针的下一个元素都为null
 * <p>
 * 逆序生成链表，
 *
 * @author didi
 * @DESCRIPTION
 * @create 2019-04-17 10:44
 **/

public class Problem2 {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode node  = new ListNode(0), tmpNode = node;
        boolean  isAdd = false;

        while (l1 != null && l2 != null) {
            int tmpResult = isAdd ? (l1.val + l2.val + 1) : (l1.val + l2.val);
            isAdd = tmpResult >= 10;
            tmpNode.next = new ListNode(test((tmpResult)));
            tmpNode = tmpNode.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        ListNode remain = l1 != null ? l1 : l2;

        while (remain != null) {
            int tmpResult = isAdd ? (remain.val + 1) : (remain.val);
            isAdd = tmpResult >= 10;
            tmpNode.next = new ListNode(test((tmpResult)));
            tmpNode = tmpNode.next;
            remain = remain.next;
        }

        if (isAdd) {
            tmpNode.next = new ListNode(1);
        }

        return node.next;
    }


    // public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
    //     // if (l1 == null || l2 == null) {
    //     //     return l1 == null ? l2 : l1;
    //     // }
    //     // int value = l1.val + l2.val;
    //     // ListNode result = new ListNode(value % 10);
    //     // result.next = addTwoNumbers2(l1.next, l2.next);
    //     // if (value >= 10) {
    //     //     result.next = addTwoNumbers2(new ListNode(value / 10), result.next);
    //     // }
    //     // return result;
    // }
    //
    // private ListNode addTwoNumbersTest(ListNode l1, ListNode l2, int tmp) {
    //
    // }

    public static void main(String[] args) {
        // ListNode a1 = new ListNode(1);
        // // new Problem2().reverse(a1);
        //
        // ListNode a2 = new ListNode(9);
        // a2.next = new ListNode(9);
        //
        // ListNode result = new Problem2().addTwoNumbers(a1, a2);
        // while (result != null) {
        //     System.out.println(result.val);
        //     result = result.next;
        // }
        System.out.println(Long.MAX_VALUE);

    }

    /**
     * 返回一个数字的个数
     *
     * @param num
     * @return
     */
    private int test(int num) {
        return num % 10;
    }

}
